iterm2 向 ssh 发送文件
mac: brew install lrzsz
server: apt-get install lrzsz
mac中创建文件:/usr/local/bin/iterm2-zmodem
#!/bin/sh
# Created by Liao Xingwang on 2019-06-10
# Copyright (c) 2019-present Liao Xingwang. All rights reserved.
# This work is licensed under the terms of the MIT license.
# For a copy, see <https://opensource.org/licenses/MIT>.
# references:
# http://oranj.io/blog/Open-File-Dialog-from-the-Shell
# https://www.satimage.fr/software/en/smile/external_codes/file_paths.html
# https://blog.sapegin.me/all/show-gui-dialog-from-shell/
export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
SEND_DIALOG_TITLE="Send File - Zmodem"
RECEIVE_DIALOG_TITLE="Receive File - Zmodem"
cancel_zmodem() {
# Send ZModem cancel
printf "\x18\x18\x18\x18\x18"
}
alert() {
msg="$1"
title="${2:-$(basename "$0")}"
icon="${3:-caution}" # stop | note | caution
osascript <<-EOF 2>/dev/null
tell application "iTerm2"
activate
display dialog "$msg" buttons {"OK"} default button 1 with title "$title" with icon $icon
return -- Suppress result
end tell
EOF
}
send_file() {
file_path="$(
osascript <<-EOF 2>/dev/null
tell application "iTerm2"
activate
set filePath to (choose file with prompt "Select a file to send")
do shell script "echo " & (quoted form of POSIX path of filePath as Unicode text)
end tell
EOF
)"
if [ -z "$file_path" ] ; then
cancel_zmodem
sleep 1 # sleep to make next "echo" works
echo
exit 0
fi
if sz "$file_path" -b -B 4096 -e -E 2>/dev/null ; then
alert "File sent to remote: $file_path" "$SEND_DIALOG_TITLE" "note"
echo
else
cancel_zmodem
alert "Transfer failed when send file: $file_path" "$SEND_DIALOG_TITLE" "stop"
echo
exit 1
fi
}
recv_file() {
folder_path="$(
osascript <<-EOF 2>/dev/null
tell application "iTerm2"
activate
set folderPath to (choose folder with prompt "Select a folder to receive file")
do shell script "echo " & (quoted form of POSIX path of folderPath as Unicode text) & " | sed 's|:/$|/|'"
end tell
EOF
)"
if [ -z "$folder_path" ] ; then
cancel_zmodem
sleep 1
echo
exit 0
fi
if [ ! -d "$folder_path" ] ; then
cancel_zmodem
alert "Can't find local folder: $folder_path" "$RECEIVE_DIALOG_TITLE" "stop"
echo
exit 1
else
if ! cd "$folder_path" ; then
cancel_zmodem
alert "Can't open local folder: $folder_path" "$RECEIVE_DIALOG_TITLE" "stop"
echo
exit 1
fi
if rz -b -B 4096 -e -E 2>/dev/null ; then
cd - || true
alert "File saved to local folder: $folder_path" "$RECEIVE_DIALOG_TITLE" "note"
echo
else
cancel_zmodem
alert "Transfer failed when recevie file" "$RECEIVE_DIALOG_TITLE" "stop"
echo
exit 1
fi
fi
}
action=${1:-"noop"}
if [ "$action" = "send" ] ; then
if ! command -v sz 2>/dev/null ; then
cancel_zmodem
alert "Command not found: sz"
echo
exit 127
fi
send_file
elif [ "$action" = "recv" ] ; then
if ! command -v rz 2>/dev/null ; then
cancel_zmodem
alert "Command not found: rz"
echo
exit 127
fi
recv_file
else
cancel_zmodem
alert "Usage: $(basename "$0") recv|send"
echo
exit 128
fi
chmod +x /usr/local/bin/iterm2-zmodem
配置 iterm2, Preferences... -> Profiles -> Advanced -> Trigger, click Edit
Regular expression: rz waiting to receive.\*\*B0100
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-zmodem send
Instant: checked
Regular expression: \*\*B00000000000000
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-zmodem recv
Instant: checked
向服务器发送文件,在服务器运行 rz
从服务器下载文件,在服务器运行 sz filename